#include "tga.hpp"

Tga::Tga(const unsigned int _altura,const unsigned int _largura) : altura(_altura), largura(_largura) {

	line_size = largura * 3;
	size = altura * line_size;

	dados = new char[size];
}

Tga::~Tga(void)
{
	delete dados;
}

unsigned int Tga::getAltura(void) const { return altura; }

unsigned int Tga::getLargura(void) const { return largura; }

void Tga::setAltura(const unsigned int _altura) { altura = _altura; }

void Tga::setLargura(const unsigned int _largura) { largura = _largura; }

void Tga::setPixel(unsigned int px,unsigned int py,const Cor& cor) {
	double r = cor.getR();
	double g = cor.getG();
	double b = cor.getB();
	
	
	if (px > largura-1) px = largura-1;
	
	if (py > altura-1) py = altura-1;
	
	int offset = py*line_size + px*3;
	
	int ir = (int) (r * 255.0);
	int ig = (int) (g * 255.0);
	int ib = (int) (b * 255.0);

	char cr,cg,cb;
	
	cr = max(0,min(ir,255));
	cg = max(0,min(ig,255));		
	cb = max(0,min(ib,255));
	
	
	dados[ offset + 0 ] = cr;
	dados[ offset + 1 ] = cg;
	dados[ offset + 2 ] = cb;
}

void Tga::salvarArquivo(const char* _arq) {
	FILE *arquivo;
	arquivo = fopen(_arq,"w+b");
	putc(0,arquivo);
	putc(0,arquivo);
	putc(2,arquivo);/* RGB nao compactado*/
	putc(0,arquivo); putc(0,arquivo);
	putc(0,arquivo); putc(0,arquivo);
	putc(0,arquivo);
	putc(0,arquivo); putc(0,arquivo);/* Origem X */
	putc(0,arquivo); putc(0,arquivo);/* Origem y */
	putc((largura & 0x00FF),arquivo);
	putc((largura & 0xFF00) / 256,arquivo);
	putc((altura & 0x00FF),arquivo);
	putc((altura & 0xFF00) / 256,arquivo);
	putc(24,arquivo); /* 24 bit bitmap */
	putc(0,arquivo);

	/* Gravacao propriamente dita */
	//for (int y = altura; y > 0; y--){
	int py,px;
	for(unsigned int y = 0;y < altura; y++) {
		py = y*line_size;
		for (unsigned int x = 0; x < largura; x++){
			px = x*3;
			putc((dados[py+px+2]),arquivo);
			putc((dados[py+px+1]),arquivo);
			putc((dados[py+px]),arquivo);
		}
	}
	fclose(arquivo);
}
